import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'
import { envConfig } from '../config/env'
import { showLoading, hideLoading } from './loading'
import { message } from 'antd' // 或其他提示组件
import type { CustomRequestConfig, BaseResponse } from './types'

// 创建 axios 实例
const service = axios.create({
    baseURL: envConfig.BASE_URL,
    timeout: 10000,
    withCredentials: true
})

// 请求拦截器
service.interceptors.request.use(
    (config: CustomRequestConfig) => {
        // 显示 Loading
        if (config.showLoading !== false) {
            showLoading()
        }

        // 添加 token
        const token = localStorage.getItem('token')
        if (token) {
            config.headers = {
                ...config.headers,
                Authorization: `Bearer ${token}`
            }
        }

        // 代理处理
        if (envConfig.PROXY_PREFIX && config.url?.startsWith(envConfig.PROXY_PREFIX)) {
            config.url = config.url.replace(envConfig.PROXY_PREFIX, '')
        }

        return config
    },
    (error) => {
        hideLoading()
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse<BaseResponse>) => {
        hideLoading()

        const { data, config } = response
        // 业务成功处理
        if (data.code === 200 || data.success) {
            return data.data
        }

        // 业务错误处理
        if ((config as CustomRequestConfig).showError !== false) {
            handleBusinessError(data.code, data.message)
        }
        return Promise.reject(data)
    },
    (error) => {
        hideLoading()

        // HTTP 错误处理
        if (error.config?.showError !== false) {
            handleHttpError(error)
        }

        return Promise.reject(error)
    }
)

// 业务错误处理
function handleBusinessError(code: number, msg: string) {
    const errorMap: Record<number, string> = {
        401: '登录已过期，请重新登录',
        403: '没有权限访问该资源',
        404: '请求资源不存在',
        500: '服务器错误'
    }

    message.error(msg || errorMap[code] || '未知错误')

    // 特殊错误处理
    if (code === 401) {
        localStorage.removeItem('token')
        setTimeout(() => {
            window.location.href = '/login'
        }, 1500)
    }
}

// HTTP 错误处理
function handleHttpError(error: any) {
    if (error.response) {
        const status = error.response.status
        const errorMap: Record<number, string> = {
            400: '请求参数错误',
            401: '未授权，请登录',
            403: '拒绝访问',
            404: '请求地址不存在',
            500: '服务器内部错误'
        }
        message.error(errorMap[status] || `连接错误 ${status}`)
    } else if (error.request) {
        message.error('网络连接异常，请检查网络')
    } else {
        message.error(error.message || '未知错误')
    }
}

// 封装通用请求方法
function request<T = any>(config: CustomRequestConfig): Promise<T> {
    return service(config)
}

// 封装常用方法
export const http = {
    get<T = any>(url: string, params?: any, config?: CustomRequestConfig): Promise<T> {
        return request({ method: 'get', url, params, ...config })
    },
    post<T = any>(url: string, data?: any, config?: CustomRequestConfig): Promise<T> {
        return request({ method: 'post', url, data, ...config })
    },
    put<T = any>(url: string, data?: any, config?: CustomRequestConfig): Promise<T> {
        return request({ method: 'put', url, data, ...config })
    },
    delete<T = any>(url: string, config?: CustomRequestConfig): Promise<T> {
        return request({ method: 'delete', url, ...config })
    }
}

export default http